# Use:
# VFP1=(cond:4) VFP2={ne(cond,15)} for ARM
# VFP1=1110 VFP2= for Thumb2
# Note that the 'T' bit in A7.5 - A7.9 of the Thumb2 encodings has been replaced with the required value of 0 in order to cut down the number of macros needed
# Similarly, the {eq(cond,15)} ARM encodings (which require a fundamentally identical constraint for Thumb2) have also been directly replaced with the desired values (although all those lines are commented out anyway since they currently get handled by encodings in other files)

# A7.5
#11111110(opc1:4)(opc2:4)(:4)101(:1)(opc3:2)(:1)0(opc4:4)	UNDEFINED # - handled by CDP2
[VFP1]1110(opc1:4)(opc2:4)(:4)101(:1)(opc3:2)(:1)0(opc4:4)	[VFP2] {eq(band(opc1,11),8)} {band(opc3,1)}	UNDEFINED_CDP_CDP2_A1
[VFP1]1110(opc1:4)(opc2:4)(:4)101(:1)(opc3:2)(:1)0(opc4:4)	[VFP2] {eq(band(opc1,11),11)} {band(opc3,1)} {eq(opc2,6)}	UNDEFINED_CDP_CDP2_A1
[VFP1]1110(opc1:4)(opc2:4)(:4)101(:1)(opc3:2)(:1)0(opc4:4)	[VFP2] {eq(band(opc1,11),11)} {eq(opc3,1)} {eq(opc2,7)}	UNDEFINED_CDP_CDP2_A1
[VFP1]1110(opc1:4)(opc2:4)(:4)101(:1)(opc3:2)(:1)0(opc4:4)	[VFP2] {eq(band(opc1,11),11)} {band(opc3,1)} {eq(opc2,9)}	UNDEFINED_CDP_CDP2_A1

# A7.6
#1111110(opcode:5)(Rn:4)(:4)101(:9)	UNDEFINED_LDC2_STC2 # - handled by LDC2, STC2
[VFP1]110(opcode:5)(Rn:4)(:4)101(:9)	[VFP2] {lt(opcode,2)}	UNDEFINED
#[VFP1]110(opcode:5)(Rn:4)(:4)101(:9)	[VFP2] {lt(opcode,4)}	UNDEFINED # - (partially?) handled by VLDM/VSTM
#[VFP1]110(opcode:5)(Rn:4)(:4)101(:9)	[VFP2] {eq(band(opcode,6),6)}	UNDEFINED # - (partially?) handled by VLDM/VSTM
#[VFP1]110(opcode:5)(Rn:4)(:4)101(:9)	[VFP2] {eq(band(opcode,0x1a),0x1a)}	UNDEFINED # - (partially?) handled by VLDM/VSTM

# A7.8
#11111110(A:3)L(:8)101C(:1)(B:2)1(:4)	UNDEFINED # - handled by MCR2, MRC2
[VFP1]1110(A:3)L(:8)101C(:1)(B:2)1(:4)	[VFP2] {lnot(L)} {lnot(C)} {A} {ne(A,7)}	UNDEFINED_MCR_MCR2_A1
[VFP1]1110(A:3)L(:8)101C(:1)(B:2)1(:4)	[VFP2] {L} {lnot(C)} {A} {ne(A,7)}	UNDEFINED_MRC_MRC2_A1
[VFP1]1110(A:3)L(:8)101C(:1)(B:2)1(:4)	[VFP2] {lnot(L)} {C} {band(A,4)} {band(B,2)}	UNDEFINED_MCR_MCR2_A1

# A7.9
#11111100010(:9)101C(op:4)(:4)	UNDEFINED # - handled by MCRR2, MRRC2
[VFP1]11000100(:8)101C(op:4)(:4)	[VFP2] {lnot(band(op,0xd))}	UNDEFINED_MCRR_MCRR2_A1
[VFP1]11000101(:8)101C(op:4)(:4)	[VFP2] {lnot(band(op,0xd))}	UNDEFINED_MRRC_MRRC2_A1
[VFP1]11000100(:8)101C(op:4)(:4)	[VFP2] {gt(op,3)}	UNDEFINED_MCRR_MCRR2_A1
[VFP1]11000101(:8)101C(op:4)(:4)	[VFP2] {gt(op,3)}	UNDEFINED_MRRC_MRRC2_A1

# A8.8.280 VABS
# A2 VFPv2, VFPv3, VFPv4
[VFP1]11101D110000(Vd:4)101(sz)11M0(Vm:4)	[VFP2]	VABS_A2 # NOTE: VFP vectors

# A8.8.283 VADD (floating-point)
# A2 VFPv2, VFPv3, VFPv4
[VFP1]11100D11(Vn:4)(Vd:4)101(sz)N0M0(Vm:4)	[VFP2]	VADD_fp_A2 # NOTE: VFP vectors

# A8.8.303 VCMP, VCMPE
# A1 VFPv2, VFPv3, VFPv4
[VFP1]11101D110100(Vd:4)101(sz)E1M0(Vm:4)	[VFP2]	VCMP_VCMPE_A1
# A2 VFPv2, VFPv3, VFPv4
[VFP1]11101D110101(Vd:4)101(sz)E1(0)0(0000)	[VFP2]	VCMP_VCMPE_A2

# A8.8.306 VCVT, VCVTR (between floating-point and integer, VFP)
# A1 VFPv2, VFPv3, VFPv4
[VFP1]11101D111(opc2:3)(Vd:4)101(sz)(op)1M0(Vm:4)	[VFP2] {lnot(land(opc2,ne(band(opc2,6),4)))}	VCVT_VCVTR_fp_int_VFP_A1

# A8.8.308 VCVT (between floating-point and fixed-point, VFP)
# A1 VFPv3, VFPv4
[VFP1]11101D111(op)1U(Vd:4)101(sf)(sx)1i0(imm4:4)	[VFP2]	VCVT_fp_fx_VFP_A1

# A8.8.309 VCVT (between double-precitions and single-precision)
# A1 VFPv2, VFPv3, VFPv4
[VFP1]11101D110111(Vd:4)101(sz)11M0(Vm:4)	[VFP2]	VCVT_dp_sp_A1

# A8.8.311 VCVTB, VCVTT (between half-precision and single-precision, VFP)
# A1 VFPv3, VFPv4
[VFP1]11101D11001(op)(Vd:4)101(0)T1M0(Vm:4)	[VFP2]	VCVTB_VCVTT_hp_sp_VFP_A1

# A8.8.312 VDIV
# A1 VFPv2, VFPv3, VFPv4
[VFP1]11101D00(Vn:4)(Vd:4)101(sz)N0M0(Vm:4)	[VFP2]	VDIV_A1 # NOTE: VFP vectors

# A8.8.317 VFMA, VFMS
# A2 VFPv4
[VFP1]11101D10(Vn:4)(Vd:4)101(sz)N(op)M0(Vm:4)	[VFP2]	VFMA_VFMS_A2

# A8.8.318 VFNMA, VFNMS
# A1 VFPv4
[VFP1]11101D01(Vn:4)(Vd:4)101(sz)N(op)M0(Vm:4)	[VFP2]	VFNMA_VFNMS_A1

# A8.8.332 VLDM
# A1 VFPv2, VFPv3, VFPv4, ASIMD
[VFP1]110PUDW1(Rn:4)(Vd:4)1011(imm8:8)	[VFP2] {lor(lor(P,U),W)} {lnot(land(land(lnot(P),U),land(W,eq(Rn,13))))} {lor(lnot(P),W)}	VLDM_A1
[VFP1]110PUDW1(Rn:4)(Vd:4)1011(imm8:8)	[VFP2] {eq(P,U)} {W} {ne(Rn,15)}	UNDEFINED_LDC_LDC2_imm_A1 in VLDM_A1
[VFP1]110PUDW11111(Vd:4)1011(imm8:8)	[VFP2] {eq(P,U)} {W}	UNDEFINED_LDC_LDC2_lit_A1 in VLDM_A1
# A2 VFPv2, VFPv3, VFPv4
[VFP1]110PUDW1(Rn:4)(Vd:4)1010(imm8:8)	[VFP2] {lor(lor(P,U),W)} {lnot(land(land(lnot(P),U),land(W,eq(Rn,13))))} {lor(lnot(P),W)}	VLDM_A2
[VFP1]110PUDW1(Rn:4)(Vd:4)1010(imm8:8)	[VFP2] {eq(P,U)} {W} {ne(Rn,15)}	UNDEFINED_LDC_LDC2_imm_A1 in VLDM_A2
[VFP1]110PUDW11111(Vd:4)1010(imm8:8)	[VFP2] {eq(P,U)} {W}	UNDEFINED_LDC_LDC2_lit_A1 in VLDM_A2

# A8.8.333 VLDR
# A1 VFPv2, VFPv3, VFPv4, ASIMD
[VFP1]1101UD01(Rn:4)(Vd:4)1011(imm8:8)	[VFP2]	VLDR_A1
# A2 VFPv2, VFPv3, VFPv4
[VFP1]1101UD01(Rn:4)(Vd:4)1010(imm8:8)	[VFP2]	VLDR_A2

# A8.8.334 VMLA, VMLS (floating-point)
# A2 VFPv2, VFPv3, VFPv4
[VFP1]11100D00(Vn:4)(Vd:4)101(sz)N(op)M0(Vm:4)	[VFP2]	VMLA_VMLS_fp_A2 # NOTE: VFP vectors

# A8.8.339 VMOV (immediate)
# A2 VFPv3, VFPv4
[VFP1]11101D11(imm4H:4)(Vd:4)101(sz)(0)0(0)0(imm4L:4)	[VFP2]	VMOV_imm_A2 # NOTE: VFP vectors

# A8.8.340 VMOV (register)
# A2 VFPv2, VFPv3, VFPv4
[VFP1]11101D110000(Vd:4)101(sz)01M0(Vm:4)	[VFP2]	VMOV_reg_A2 # NOTE: VFP vectors

# A8.8.341 VMOV (ARM core register to scalar)
# A1 VFPv2, VFPv3, VFPv4, ASIMD
[VFP1]11100(opc1:2)0(Vd:4)(Rt:4)1011D(opc2:2)1(0000)	[VFP2]	VMOV_arm_A1
[VFP1]11100(opc1:2)0(Vd:4)(Rt:4)1011D(opc2:2)1(0000)	[VFP2] {lnot(band(opc1,2))} {eq(opc2,2)}	UNDEFINED_MCR_MCR2_A1 in VMOV_arm_A1

# A8.8.342 VMOV (scalar to ARM core register)
# A1 VFPv2, VFPv3, VFPv4, ASIMD
[VFP1]1110U(opc1:2)1(Vn:4)(Rt:4)1011N(opc2:2)1(0000)	[VFP2]	VMOV_scalar_A1
[VFP1]1110U(opc1:2)1(Vn:4)(Rt:4)1011N(opc2:2)1(0000)	[VFP2] {lnot(band(opc1,2))} {lor(land(U,lnot(opc2)),eq(opc2,2))}	UNDEFINED_MRC_MRC2_A1 in VMOV_scalar_A1

# A8.8.343 VMOV (betweem ARM core register and single-precition register)
# A1 VFPv2, VFPv3, VFPv4
[VFP1]1110000(op)(Vn:4)(Rt:4)1010N(00)1(0000)	[VFP2]	VMOV_1fp_A1

# A8.8.344 VMOV (between two ARM core registers and two single-precision registers)
# A1 VFPv2, VFPv3, VFPv4
[VFP1]1100010(op)(Rt2:4)(Rt:4)101000M1(Vm:4)	[VFP2]	VMOV_2fp_A1

# A8.8.345 VMOV (between two ARM core registers and a doubleword extension register)
# A1 VFPv2, VFPv3, VFPv4, ASIMD
[VFP1]1100010(op)(Rt2:4)(Rt:4)101100M1(Vm:4)	[VFP2]	VMOV_dbl_A1

# A8.8.348 VMRS
# A1 VFPv2, VFPv3, VFPv4, ASIMD
#[VFP1]111011110001(Rt:4)10100(00)1(0000)	[VFP2]	VMRS_A1 # - covered by B6.1.14 (ish - bit 7 is (0))

# A8.8.349 VMSR
# A1 VFPv2, VFPv3, VFPv4, ASIMD
#[VFP1]111011100001(Rt:4)10100(00)1(0000)	[VFP2]	VMSR_A1 # - covered by B6.1.15 (ish - bit 7 is (0))

# A8.8.351 VMUL (floating-point)
# A2 VFPv2, VFPv3, VFPv4
[VFP1]11100D10(Vn:4)(Vd:4)101(sz)N0M0(Vm:4)	[VFP2]	VMUL_fp_A2 # NOTE: VFP vectors

# A8.8.355 VNEG
# A2 VFPv2, VFPv3, VFPv4
[VFP1]11101D110001(Vd:4)101(sz)01M0(Vm:4)	[VFP2]	VNEG_A2 # NOTE: VFP vectors

# A8.8.356 VNMLA, VNMLS, VNMUL
# A1 VFPv2, VFPv3, VFPv4
[VFP1]11100D01(Vn:4)(Vd:4)101(sz)N(op)M0(Vm:4)	[VFP2]	VNMLA_VNMLS_VNMUL_A1 # NOTE: VFP vectors
# A2 VFPv2, VFPv3, VFPv4
[VFP1]11100D10(Vn:4)(Vd:4)101(sz)N1M0(Vm:4)	[VFP2]	VNMLA_VNMLS_VNMUL_A2 # NOTE: VFP vectors

# A8.8.367 VPOP
# A1 VFPv2, VFPv3, VFPv4, ASIMD
[VFP1]11001D111101(Vd:4)1011(imm8:8)	[VFP2]	VPOP_A1
# A2 VFPv2, VFPv3, VFPv4
[VFP1]11001D111101(Vd:4)1010(imm8:8)	[VFP2]	VPOP_A2

# A8.8.368 VPUSH
# A1 VFPv2, VFPv3, VFPv4, ASIMD
[VFP1]11010D101101(Vd:4)1011(imm8:8)	[VFP2]	VPUSH_A1
# A2 VFPv2, VFPv3, VFPv4
[VFP1]11010D101101(Vd:4)1010(imm8:8)	[VFP2]	VPUSH_A2

# A8.8.401 VSQRT
# A1 VFPv2, VFPv3, VFPv4
[VFP1]11101D110001(Vd:4)101(sz)11M0(Vm:4)	[VFP2]	VSQRT_A1 # NOTE: VFP vectors

# A8.8.412 VSTM
# A1 VFPv2, VFPv3, VFPv4, ASIMD
[VFP1]110PUDW0(Rn:4)(Vd:4)1011(imm8:8)	[VFP2] {lor(lor(P,U),W)} {lnot(land(land(P,lnot(U)),land(W,eq(Rn,13))))} {lor(lnot(P),W)}	VSTM_A1
[VFP1]110PUDW0(Rn:4)(Vd:4)1011(imm8:8)	[VFP2] {eq(P,U)} {W}	UNDEFINED_STC_STC2_A1 in VSTM_A1
# A2 VFPv2, VFPv3, VFPv4
[VFP1]110PUDW0(Rn:4)(Vd:4)1010(imm8:8)	[VFP2] {lor(lor(P,U),W)} {lnot(land(land(P,lnot(U)),land(W,eq(Rn,13))))} {lor(lnot(P),W)}	VSTM_A2
[VFP1]110PUDW0(Rn:4)(Vd:4)1010(imm8:8)	[VFP2] {eq(P,U)} {W}	UNDEFINED_STC_STC2_A1 in VSTM_A2

# A8.8.413 VSTR
# A1 VFPv2, VFPv3, VFPv4, ASIMD
[VFP1]1101UD00(Rn:4)(Vd:4)1011(imm8:8)	[VFP2]	VSTR_A1
# A2 VFPv2, VFPv3, VFPv4
[VFP1]1101UD00(Rn:4)(Vd:4)1010(imm8:8)	[VFP2]	VSTR_A2

# A8.8.415 VSUB (floating-point)
# A2 VFPv2, VFPv3, VFPv4
[VFP1]11100D11(Vn:4)(Vd:4)101(sz)N1M0(Vm:4)	[VFP2]	VSUB_fp_A2 # NOTE: VFP vectors

# B9.3.14 VMRS
# A1 VFPv2, VFPv3, VFPv4, ASIMD
[VFP1]11101111(reg:4)(Rt:4)1010(000)1(0000)	[VFP2]	VMRS_A1

# B9.3.15 VMSR
# A1 VFPv2, VFPv3, VFPv4, ASIMD
[VFP1]11101110(reg:4)(Rt:4)1010(000)1(0000)	[VFP2]	VMSR_A1
